home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Environments / PowerMacOberon feb96 / Source / Catalogs.Mod (.txt) < prev    next >
Encoding:
Oberon Text  |  1995-12-04  |  4.4 KB  |  111 lines  |  [TEXT/.Ob4]

  1. Syntax10.Scn.Fnt
  2. Syntax10b.Scn.Fnt
  3. Syntax10i.Scn.Fnt
  4. MODULE Catalogs;    (** CAS 11-Sep-90, CS 10 Aug 94 **)
  5.     IMPORT Oberon, Viewers, Texts, TextFrames, MenuViewers;
  6.     CONST
  7.         Menu = "System.Close  System.Copy  System.Grow  Edit.Search  Edit.Store";
  8.     TYPE
  9.         LineBuf = ARRAY 128 OF CHAR;
  10.         LineExt = ARRAY 32 OF CHAR;
  11.         Line = POINTER TO LineDesc;
  12.         LineDesc = RECORD
  13.             l, r: Line;
  14.             ext: LineExt;
  15.             buf: LineBuf
  16.         END;
  17.         T: Texts.Text;
  18.         W: Texts.Writer;
  19.     PROCEDURE Str(s: ARRAY OF CHAR);
  20.     BEGIN Texts.WriteString(W, s)
  21.     END Str;
  22.     PROCEDURE Int(i: LONGINT);
  23.     BEGIN Texts.WriteInt(W, i, 0)
  24.     END Int;
  25.     PROCEDURE Ln;
  26.     BEGIN Texts.WriteLn(W)
  27.     END Ln;
  28.     PROCEDURE OpenViewer(cmd: ARRAY OF CHAR);
  29.         VAR V: MenuViewers.Viewer; x, y: INTEGER; t, d: LONGINT;
  30.     BEGIN Oberon.AllocateUserViewer(Oberon.Mouse.X, x, y); T := TextFrames.Text(""); Texts.OpenBuf(W.buf);
  31.         Str(cmd); Str("    "); Oberon.GetClock(t, d); Texts.WriteDate(W, t, d); Ln; Ln;
  32.         V := MenuViewers.New(TextFrames.NewMenu(cmd, Menu), TextFrames.NewText(T, 0), TextFrames.menuH, x, y)
  33.     END OpenViewer;
  34.     PROCEDURE SortIn(VAR u: Line; v: Line);
  35.     BEGIN
  36.         IF u = NIL THEN u := v ELSIF v.ext < u.ext THEN SortIn(u.l, v) ELSE SortIn(u.r, v) END
  37.     END SortIn;
  38.     PROCEDURE OutLines(u: Line);
  39.         VAR ext: LineExt; cnt: INTEGER;
  40.         PROCEDURE Out(u: Line);
  41.         BEGIN
  42.             IF u # NIL THEN Out(u.l);
  43.                 IF ext # u.ext THEN
  44.                     IF cnt > 0 THEN Int(cnt); Str(" files"); Ln; Ln; cnt := 0 END;
  45.                     ext := u.ext; Str(ext); Ln
  46.                 END;
  47.                 Str("    "); Str(u.buf); Ln; INC(cnt); Out(u.r)
  48.             END
  49.         END Out;
  50.     BEGIN ext[0] := 0X; cnt := 0; Out(u);
  51.         IF cnt > 0 THEN Int(cnt); Str(" files"); Ln; Ln END
  52.     END OutLines;
  53.     PROCEDURE Stat*;    (**marked directory viewer**)
  54.         VAR V: Viewers.Viewer; dir: Texts.Text; R: Texts.Reader; S: Texts.Scanner; i, j, cnt: INTEGER; s, n: LONGINT;
  55.             lines, line: Line; buf: LineBuf; ext: ARRAY 10 OF LineExt;
  56.     BEGIN V := Oberon.MarkedViewer(); dir := V.dsc.next(TextFrames.Frame).text;
  57.         OpenViewer("Catalogs.Stat"); cnt := 0; lines := NIL;
  58.         ext[0] := "<   1K"; ext[1] := "<   2K"; ext[2] := "<   4K"; ext[3] := "<   8K";
  59.         ext[4] := "<  16K"; ext[5] := "<  32K"; ext[6] := "<  64K"; ext[7] := "< 128K";
  60.         ext[8] := "< 256K"; ext[9] := ">= 256K";
  61.         Texts.OpenReader(R, dir, 0); Texts.Read(R, buf[0]);
  62.         WHILE ~R.eot DO i := 0;
  63.             WHILE ~R.eot & (buf[i] # 0DX) DO INC(i); Texts.Read(R, buf[i]) END;
  64.             buf[i] := 0X;
  65.             IF ~R.eot THEN INC(cnt);
  66.                 Texts.OpenScanner(S, dir, Texts.Pos(R) - 7); Texts.Scan(S);
  67.                 IF S.class = Texts.Int THEN s := S.i; j := 9; n := 40000H;
  68.                     LOOP
  69.                         IF s >= n THEN NEW(line); line.ext := ext[j]; line.buf := buf; SortIn(lines, line); EXIT END;
  70.                         n := n DIV 2; DEC(j); IF j < 0 THEN EXIT END
  71.                     END
  72.                 END;
  73.                 Texts.Read(R, buf[0])
  74.             END
  75.         END;
  76.         OutLines(lines); Str("total of "); Int(cnt); Str(" files counted."); Ln;
  77.         Texts.Append(T, W.buf);
  78.         Oberon.Collect(0)
  79.     END Stat;
  80.     PROCEDURE Sort*;    (**marked directory viewer**)
  81.         VAR V: Viewers.Viewer; dir: Texts.Text; R: Texts.Reader; i, j, k, cnt: INTEGER; ch: CHAR;
  82.             lines, line: Line; buf: LineBuf; ext: LineExt;
  83.             l: INTEGER; (* position of first " *)
  84.     BEGIN V := Oberon.MarkedViewer(); dir := V.dsc.next(TextFrames.Frame).text;
  85.         OpenViewer("Catalogs.Sort"); cnt := 0; lines := NIL;
  86.         Texts.OpenReader(R, dir, 0); Texts.Read(R, ch);
  87.         WHILE ~R.eot DO i := 0; j := 0; k := -1; l := -1;
  88.             WHILE ~R.eot & (ch # 0DX) DO
  89.                 buf[i] := ch; INC(i);
  90.                 IF k < 0 THEN
  91.                     IF ch = "." THEN j := i
  92.                     ELSIF (l < 0) & (ch = '"') THEN l := i    (* <= CS, 9 Aug 94, ignore blanks within strings *)
  93.                     ELSIF (l >= 0) & (ch = '"') THEN l := -1
  94.                     ELSIF (l < 0) & (ch = " ") THEN k := i END
  95.                 END;
  96.                 Texts.Read(R, ch)
  97.             END;
  98.             buf[i] := 0X; IF k < 0 THEN k := i END;
  99.             i := 0; WHILE (j < k) & (buf[j] # '"') DO ext[i] := buf[j]; INC(i); INC(j) END;    (* <= CS, 9 Aug 94, skip " at end of extension *)
  100.             IF (i > 0) & (ext[i - 1] = '"') THEN ext[i - 1] := 0X ELSE ext[i] := 0X END;
  101.             IF ~R.eot THEN INC(cnt); NEW(line); line.ext := ext; line.buf := buf; SortIn(lines, line); Texts.Read(R, ch) END
  102.         END;
  103.         OutLines(lines); Str("total of "); Int(cnt); Str(" files processed."); Ln;
  104.         Texts.Append(T, W.buf);
  105.         Oberon.Collect(0)
  106.     END Sort;
  107. BEGIN Texts.OpenWriter(W)
  108. END Catalogs.
  109. Catalogs.Stat    (*marked directory viewer*)
  110. Catalogs.Sort    (*marked directory viewer*)
  111.